<!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <title>&#x540e;&#x7aef;&#x63a5;&#x53e3;&#x5217;&#x8868;</title>
            <style>
/* From extension vscode.github */
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

.vscode-dark img[src$=\#gh-light-mode-only],
.vscode-light img[src$=\#gh-dark-mode-only],
.vscode-high-contrast:not(.vscode-high-contrast-light) img[src$=\#gh-light-mode-only],
.vscode-high-contrast-light img[src$=\#gh-dark-mode-only] {
	display: none;
}

</style>
            
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/highlight.css">
<style>
            body {
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif;
                font-size: 14px;
                line-height: 1.6;
            }
        </style>
        <style>
.task-list-item {
    list-style-type: none;
}

.task-list-item-checkbox {
    margin-left: -20px;
    vertical-align: middle;
    pointer-events: none;
}
</style>
<style>
:root {
  --color-note: #0969da;
  --color-tip: #1a7f37;
  --color-warning: #9a6700;
  --color-severe: #bc4c00;
  --color-caution: #d1242f;
  --color-important: #8250df;
}

</style>
<style>
@media (prefers-color-scheme: dark) {
  :root {
    --color-note: #2f81f7;
    --color-tip: #3fb950;
    --color-warning: #d29922;
    --color-severe: #db6d28;
    --color-caution: #f85149;
    --color-important: #a371f7;
  }
}

</style>
<style>
.markdown-alert {
  padding: 0.5rem 1rem;
  margin-bottom: 16px;
  color: inherit;
  border-left: .25em solid #888;
}

.markdown-alert>:first-child {
  margin-top: 0
}

.markdown-alert>:last-child {
  margin-bottom: 0
}

.markdown-alert .markdown-alert-title {
  display: flex;
  font-weight: 500;
  align-items: center;
  line-height: 1
}

.markdown-alert .markdown-alert-title .octicon {
  margin-right: 0.5rem;
  display: inline-block;
  overflow: visible !important;
  vertical-align: text-bottom;
  fill: currentColor;
}

.markdown-alert.markdown-alert-note {
  border-left-color: var(--color-note);
}

.markdown-alert.markdown-alert-note .markdown-alert-title {
  color: var(--color-note);
}

.markdown-alert.markdown-alert-important {
  border-left-color: var(--color-important);
}

.markdown-alert.markdown-alert-important .markdown-alert-title {
  color: var(--color-important);
}

.markdown-alert.markdown-alert-warning {
  border-left-color: var(--color-warning);
}

.markdown-alert.markdown-alert-warning .markdown-alert-title {
  color: var(--color-warning);
}

.markdown-alert.markdown-alert-tip {
  border-left-color: var(--color-tip);
}

.markdown-alert.markdown-alert-tip .markdown-alert-title {
  color: var(--color-tip);
}

.markdown-alert.markdown-alert-caution {
  border-left-color: var(--color-caution);
}

.markdown-alert.markdown-alert-caution .markdown-alert-title {
  color: var(--color-caution);
}

</style>
        
        </head>
        <body class="vscode-body vscode-light">
            <h1 id="后端接口列表">后端接口列表</h1>
<h2 id="1-用户管理接口">1. 用户管理接口</h2>
<h3 id="11-获取用户列表">1.1 获取用户列表</h3>
<pre><code>GET /api/users

请求参数：
{
    &quot;page&quot;: number,       // 页码
    &quot;pageSize&quot;: number,  // 每页数量
    &quot;keyword&quot;: string    // 搜索关键词（可选，支持姓名和学号搜索）
}

返回数据：
{
    &quot;code&quot;: number,      // 状态码
    &quot;data&quot;: {
        &quot;total&quot;: number,  // 总数
        &quot;list&quot;: [{
            &quot;id&quot;: number,
            &quot;name&quot;: string,
            &quot;student_id&quot;: string,    // 学号
            &quot;is_active&quot;: boolean,    // 在校状态
            &quot;created_at&quot;: string,    // 创建时间
            &quot;rollCallCount&quot;: number,  // 被点名次数
            &quot;lastRollCallTime&quot;: string // 上次被点名时间
        }]
    }
}
</code></pre>
<h3 id="12-创建用户">1.2 创建用户</h3>
<pre><code>POST /api/users

请求参数：
{
    &quot;name&quot;: string,       // 姓名
    &quot;student_id&quot;: string, // 学号
    &quot;is_active&quot;: boolean  // 在校状态
}

返回数据：
{
    &quot;code&quot;: number,
    &quot;message&quot;: string,
    &quot;data&quot;: {
        &quot;id&quot;: number,
        &quot;name&quot;: string,
        &quot;student_id&quot;: string,
        &quot;is_active&quot;: boolean,
        &quot;created_at&quot;: string
    }
}
</code></pre>
<h3 id="13-更新用户">1.3 更新用户</h3>
<pre><code>PUT /api/users/:id

请求参数：
{
    &quot;name&quot;: string,       // 姓名
    &quot;student_id&quot;: string, // 学号
    &quot;is_active&quot;: boolean  // 在校状态
}

返回数据：
{
    &quot;code&quot;: number,
    &quot;message&quot;: string,
    &quot;data&quot;: {
        &quot;id&quot;: number,
        &quot;name&quot;: string,
        &quot;student_id&quot;: string,
        &quot;is_active&quot;: boolean,
        &quot;updated_at&quot;: string
    }
}
</code></pre>
<h3 id="14-删除用户">1.4 删除用户</h3>
<pre><code>DELETE /api/users/:id

返回数据：
{
    &quot;code&quot;: number,
    &quot;message&quot;: string
}
</code></pre>
<h3 id="15-批量删除用户">1.5 批量删除用户</h3>
<pre><code>POST /api/users/batch-delete

请求参数：
{
    &quot;ids&quot;: number[]  // 用户ID列表
}

返回数据：
{
    &quot;code&quot;: number,
    &quot;message&quot;: string,
    &quot;data&quot;: {
        &quot;success&quot;: number,  // 成功删除数量
        &quot;fail&quot;: number     // 失败数量
    }
}
</code></pre>
<h3 id="16-批量导入用户">1.6 批量导入用户</h3>
<pre><code>POST /api/users/import

请求参数：
FormData:
- file: Excel文件（支持.xlsx, .xls格式）

返回数据：
{
    &quot;code&quot;: number,
    &quot;message&quot;: string,
    &quot;data&quot;: {
        &quot;successCount&quot;: number,  // 成功导入数量
        &quot;failCount&quot;: number,    // 失败数量
        &quot;failList&quot;: [{         // 失败列表
            &quot;row&quot;: number,
            &quot;reason&quot;: string
        }]
    }
}
</code></pre>
<h3 id="17-导出用户">1.7 导出用户</h3>
<pre><code>GET /api/users/export

返回数据：
Excel文件（.xlsx格式）
</code></pre>
<pre><code>
## 2. 点名相关接口

### 2.1 执行随机点名
</code></pre>
<p>POST /api/roll-call/random</p>
<p>请求参数：<br>
{<br>
&quot;count&quot;: number      // 点名人数，默认3<br>
}</p>
<p>返回数据：<br>
{<br>
&quot;code&quot;: number,<br>
&quot;data&quot;: [{<br>
&quot;id&quot;: string,<br>
&quot;name&quot;: string,<br>
&quot;rollCallCount&quot;: number<br>
}]<br>
}</p>
<pre><code>
### 2.2 记录面试官选择
</code></pre>
<p>POST /api/roll-call/interviewers</p>
<p>请求参数：<br>
{<br>
&quot;rollCallId&quot;: string,    // 点名记录ID<br>
&quot;candidateId&quot;: string,   // 被点名人ID<br>
&quot;interviewerIds&quot;: string[]  // 面试官ID列表<br>
}</p>
<p>返回数据：<br>
{<br>
&quot;code&quot;: number,<br>
&quot;data&quot;: {<br>
&quot;success&quot;: boolean<br>
}<br>
}</p>
<pre><code>
### 2.3 记录面试结果
</code></pre>
<p>POST /api/roll-call/interview-result</p>
<p>请求参数：<br>
{<br>
&quot;rollCallId&quot;: string,     // 点名记录ID<br>
&quot;candidateId&quot;: string,    // 被点名人ID<br>
&quot;interviewerId&quot;: string,  // 面试官ID<br>
&quot;question&quot;: string,       // 面试题<br>
&quot;result&quot;: boolean        // 答题结果（true: 会，false: 不会）<br>
}</p>
<p>返回数据：<br>
{<br>
&quot;code&quot;: number,<br>
&quot;data&quot;: {<br>
&quot;reward&quot;: {<br>
&quot;interviewer&quot;: number,  // 面试官奖励<br>
&quot;candidate&quot;: number     // 求职者奖励<br>
}<br>
}<br>
}</p>
<pre><code>
## 3. 历史记录接口

### 3.1 获取点名历史
</code></pre>
<p>GET /api/roll-call/history</p>
<p>请求参数：<br>
{<br>
&quot;page&quot;: number,<br>
&quot;pageSize&quot;: number,<br>
&quot;startDate&quot;: string,    // 开始日期<br>
&quot;endDate&quot;: string,      // 结束日期<br>
&quot;userId&quot;: string        // 用户ID（可选）<br>
}</p>
<p>返回数据：<br>
{<br>
&quot;code&quot;: number,<br>
&quot;data&quot;: {<br>
&quot;total&quot;: number,<br>
&quot;list&quot;: [{<br>
&quot;id&quot;: string,<br>
&quot;date&quot;: string,<br>
&quot;candidate&quot;: {<br>
&quot;id&quot;: string,<br>
&quot;name&quot;: string<br>
},<br>
&quot;interviewers&quot;: [{<br>
&quot;id&quot;: string,<br>
&quot;name&quot;: string<br>
}],<br>
&quot;questions&quot;: [{<br>
&quot;content&quot;: string,<br>
&quot;result&quot;: boolean,<br>
&quot;interviewer&quot;: {<br>
&quot;id&quot;: string,<br>
&quot;name&quot;: string<br>
}<br>
}]<br>
}]<br>
}<br>
}</p>
<pre><code>
### 3.2 导出历史记录
</code></pre>
<p>GET /api/roll-call/history/export</p>
<p>请求参数：<br>
{<br>
&quot;startDate&quot;: string,    // 开始日期<br>
&quot;endDate&quot;: string,      // 结束日期<br>
&quot;userId&quot;: string        // 用户ID（可选）<br>
}</p>
<p>返回数据：<br>
Excel文件流</p>
<pre><code>
## 4. 奖励相关接口

### 4.1 获取奖励排行榜
</code></pre>
<p>GET /api/rewards/ranking</p>
<p>请求参数：<br>
{<br>
&quot;type&quot;: string,        // 类型：candidate（求职者）/ interviewer（面试官）<br>
&quot;timeRange&quot;: string    // 时间范围：day/week/month/all<br>
}</p>
<p>返回数据：<br>
{<br>
&quot;code&quot;: number,<br>
&quot;data&quot;: [{<br>
&quot;id&quot;: string,<br>
&quot;name&quot;: string,<br>
&quot;totalReward&quot;: number,  // 总奖励金额<br>
&quot;details&quot;: [{          // 奖励明细<br>
&quot;date&quot;: string,<br>
&quot;amount&quot;: number,<br>
&quot;reason&quot;: string<br>
}]<br>
}]<br>
}</p>
<pre><code></code></pre>

            
            
        </body>
        </html>